#ifndef CPP_TIMER_H
#define CPP_TIMER_H

#include <thread>
#include <chrono>
#include <mutex>
#include <condition_variable>
#include <atomic>
#include <map>
#include <vector>

/* 调用例子 @{
bool timerTask(Timer& timer) {
    cvte_log("timerTask : %d", timer.getId());
    return true; //返回true代表继续循环，返回flase表示停止循环
}
Timer timer; //注意生命周期
timer.setId(1);
timer.schedule(timerTask, 3000, 1000); //开始定时任务，3000代表延时3000ms后开始定时器，1000代表定时器周期时间为1000ms

//timer.cancel(); 为停止定时任务
//可以不cancel原有定时任务，直接schedule新的定时任务，schedule会自动cancel已有的定时任务
 * 调用例子 @} */

//@brief 定时器
//@author cvte
//@description 实现定时器功能
class Timer {
   public:
    typedef std::function<bool(Timer& timer)> TimerTask;
    typedef std::vector<long> TaskIdVector;
    Timer();
    ~Timer();

    void schedule(const TimerTask& task, long delayMs, long periodMs);
    void cancel();
    bool isRunning();
    void setId(const int id);
    int getId();
    void setExtendData(void* pointer); //设置扩展数据，可用于将数据传给回调函数
    void* getExtendData();

    typedef std::function<void()> FunctionTask;
    long setTimeout(const FunctionTask& task, long delayMs);
    void clearTimeout(long taskId);
    static std::map<long, FunctionTask> sFunctionTaskMap;
    static long sTaskId;

    long setIntervalTimeout(const FunctionTask& task, long delayMs);
    void clearIntervalTimeout(long taskId);
    static std::map<long, FunctionTask> sIntervalFunctionTaskMap;
    static long sIntervalTaskId;

   private:
    std::mutex mThreadLock;
    std::condition_variable_any mThreadCon;

    TimerTask mTimerTask = nullptr;
    void* mExtendData = nullptr;

    int mId = -1;
    bool mIsRunning = false;
    long mDelayMs = 0;
    long mPeriodMs = 0;

    void _start();
    void _temporize();
    void _deleteThread();

    TaskIdVector mTaskIdIds;
    void clearAllTimeout();
};

#endif /* CPP_TIMER_H */